config/v1/types_cluster_operator: Expand upgradeable inputs to cluster scope #926
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Consider these cases:
a. Component A is in a state that allows updates, and nothing in the rest of the cluster would break if A updated.
b. Component A is in a state that allows updates, but component B (which is in-cluster, but not part of A) would break if A updated.
c. Component A would break if it updated.
Operator A should pretty clearly be
Upgradeable=Truefor (a) andUpgradeable=Falsefor (c).Before this commit, a narrow reading of the comment would have operator A be
Upgradeable=Truefor (b). This commit moves it toUpgradeable=False, based on discussion in openshift/enhancements#762, where it becomes the job of the API-server to setUpgradeable=Falseif updating the API-server would break nodes running old kubelets. The API-server can say "to unblock minor updates, update your kubelets". The machine-config operator will simultaneously say "hey, your kubelets are old, and here's how to update:$STEPS", but it won't useUpgradeable=Falseto say that (because the machine-config operator would be happy to have its component nodes updated).As pointed out in discussion in openshift/enhancements#762, this is a bit of a bottomless pit. For example, component A may be removing a deprecated feature on update, and there may be user workloads that occasionally depend on that feature but hardly ever use it. Component A might reasonably think "nobody has used
$OUTGOING_FEATUREin the last week, so I'mUpgradeable=True", and then post-update, the user-workload would go to hit the removed API and break. And obviously in-cluster components will have even more limited access to any out-of-cluster components that depend on them. So usingUpgradeable=Falseto protect other components from breaking is going to be a best-effort sort of thing. But this commit pivots so that it's more clear that we'll put that effort in when we can.